Lazy Loading এবং Eager Loading হল ডেটাবেস থেকে সম্পর্কিত ডেটা লোড করার দুটি ভিন্ন কৌশল। SQLAlchemy ORM (Object Relational Mapping) এ এই দুটি কৌশল ব্যবহৃত হয়, যা ডেটাবেসের সাথে সম্পর্কিত অবজেক্টগুলো লোড করার সময় ব্যবহৃত হয়।
Lazy Loading
Lazy Loading একটি কৌশল, যেখানে সম্পর্কিত অবজেক্টগুলি অবিলম্বে লোড করা হয় না, তবে এগুলোকে প্রয়োজনের সময় লোড করা হয়। যখন আপনি কোনো অবজেক্টের সাথে সম্পর্কিত ডেটা অ্যাক্সেস করতে চেষ্টা করেন, তখন SQLAlchemy তখনই সম্পর্কিত ডেটা লোড করবে। এটি ডেটাবেস অপারেশনগুলোর মধ্যে সর্বনিম্ন সঞ্চালন করে এবং শুধুমাত্র যখন ডেটার প্রয়োজন হয়, তখনই ডেটা লোড হয়।
বৈশিষ্ট্য:
- প্রাথমিক লোডিং: শুধুমাত্র অবজেক্টের প্রাথমিক ডেটা লোড হয়। সম্পর্কিত ডেটা পরবর্তী সময়ে লোড করা হয়।
- পারফরম্যান্স: প্রথমে কম ডেটা লোড হয়, ফলে প্রথম লোডিং দ্রুত হয়, কিন্তু সম্পর্কিত ডেটা অ্যাক্সেস করার সময় অতিরিক্ত ডেটাবেস কুয়েরি প্রয়োজন হতে পারে।
উদাহরণ:
from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Parent(Base):
__tablename__ = 'parents'
id = Column(Integer, primary_key=True)
name = Column(String)
class Child(Base):
__tablename__ = 'children'
id = Column(Integer, primary_key=True)
name = Column(String)
parent_id = Column(Integer, ForeignKey('parents.id'))
parent = relationship("Parent", lazy='select') # Lazy Loading
# ইঞ্জিন এবং সেশন তৈরি
engine = create_engine('sqlite:///example.db', echo=True)
Session = sessionmaker(bind=engine)
session = Session()
# Parent এবং Child অবজেক্ট তৈরি করা
parent = Parent(name="John Doe")
child = Child(name="Jane Doe", parent=parent)
# ডেটাবেসে সেভ করা
session.add(parent)
session.commit()
# Parent অবজেক্টে সম্পর্কিত Child অবজেক্ট অ্যাক্সেস করা
parent_from_db = session.query(Parent).first()
print(parent_from_db.name) # Parent নাম প্রিন্ট হবে
# এখানে Child অবজেক্ট সম্পর্কিত ডেটা তখনই লোড হবে যখন parent_from_db.child অ্যাক্সেস করা হবে
print(parent_from_db.child.name) # Lazy loading এর মাধ্যমে Child অবজেক্ট লোড হবে
এখানে, Parent অবজেক্টের সাথে সম্পর্কিত Child অবজেক্টকে Lazy Loading পদ্ধতিতে লোড করা হচ্ছে। যখন parent_from_db.child অ্যাক্সেস করা হবে, তখনই সম্পর্কিত Child অবজেক্টটি ডেটাবেস থেকে লোড হবে।
Eager Loading
Eager Loading হল এমন একটি কৌশল, যেখানে সম্পর্কিত ডেটা প্রথম থেকেই লোড হয়ে যায়। যখন আপনি মূল অবজেক্ট (Parent) লোড করেন, তখন সম্পর্কিত অবজেক্টগুলোও একই সাথে লোড হয়ে যায়। এটি সম্পর্কিত ডেটা লোড করার জন্য একাধিক কুয়েরি চালাতে বাধা দেয় এবং ডেটাবেস থেকে সম্পর্কিত সব ডেটা একসাথে নিয়ে আসে।
বৈশিষ্ট্য:
- পুরো ডেটা লোডিং: মূল অবজেক্টের সাথে সম্পর্কিত সমস্ত অবজেক্ট একই সাথে লোড করা হয়।
- পারফরম্যান্স: এটি একাধিক কুয়েরি চালানোর প্রয়োজনীয়তা কমায়, তবে অনেক ডেটা একসাথে লোড হওয়ায় এটি মেমোরি খরচ বাড়াতে পারে।
উদাহরণ:
from sqlalchemy.orm import joinedload
# Eager Loading এর জন্য relationship পদ্ধতি ব্যবহার করা
parent_from_db = session.query(Parent).options(joinedload(Parent.child)).first()
# এখন Parent এর সাথে সম্পর্কিত Child অবজেক্টও একসাথে লোড হয়ে যাবে
print(parent_from_db.name)
print(parent_from_db.child.name) # Eager loading এর মাধ্যমে Child অবজেক্ট লোড হবে
এখানে, joinedload পদ্ধতি ব্যবহার করে Parent অবজেক্টের সাথে সম্পর্কিত Child অবজেক্ট Eager Loading পদ্ধতিতে লোড করা হয়েছে। এই কৌশলে একসাথে ডেটাবেস থেকে Parent এবং Child উভয় অবজেক্টই লোড হবে।
Lazy Loading বনাম Eager Loading এর পার্থক্য
| বৈশিষ্ট্য | Lazy Loading | Eager Loading |
|---|---|---|
| লোডিং সময় | সম্পর্কিত অবজেক্ট লোড হয় প্রয়োজনের সময় | সম্পর্কিত সব অবজেক্ট একসাথে লোড হয় |
| পারফরম্যান্স | প্রথম লোডিং দ্রুত কিন্তু অতিরিক্ত কুয়েরি হতে পারে | একাধিক কুয়েরি কমিয়ে দেয়, তবে অতিরিক্ত মেমোরি ব্যবহার হতে পারে |
| ডেটাবেস কুয়েরি | প্রাথমিকভাবে মূল অবজেক্ট লোড হয়, পরে সম্পর্কিত ডেটা লোড হয় | সম্পর্কিত সব ডেটা একসাথে ডেটাবেস থেকে লোড হয় |
| ব্যবহার | ছোট, একক সম্পর্কিত ডেটা লোড করার জন্য উপযুক্ত | সম্পর্কিত সব ডেটা একসাথে লোড করতে উপযুক্ত |
কোন পরিস্থিতিতে কোন পদ্ধতি ব্যবহার করবেন?
- Lazy Loading ব্যবহার করুন যদি:
- আপনি জানেন না যে আপনার কিভাবে সম্পর্কিত ডেটা ব্যবহার হবে এবং আপনি ডেটাবেসে অতিরিক্ত কুয়েরি পাঠাতে চান না।
- আপনি ছোট বা নির্দিষ্ট পরিমাণে সম্পর্কিত ডেটা লোড করতে চান।
- Eager Loading ব্যবহার করুন যদি:
- আপনি নিশ্চিত যে আপনার প্রধান অবজেক্টের সাথে সম্পর্কিত ডেটা প্রয়োজন হবে এবং একাধিক কুয়েরি না চালিয়ে একসাথে সব ডেটা লোড করতে চান।
- একাধিক সম্পর্কিত ডেটা একযোগে লোড করা দরকার।
সারাংশ
Lazy Loading এবং Eager Loading হল ডেটাবেস থেকে সম্পর্কিত ডেটা লোড করার দুটি কৌশল। Lazy Loading কেবল তখনই সম্পর্কিত ডেটা লোড করে যখন সেটি প্রয়োজন হয়, তবে Eager Loading সম্পর্কিত সমস্ত ডেটা একসাথে লোড করে। আপনি প্রয়োজনে এই দুটি পদ্ধতির মধ্যে যেকোনো একটি ব্যবহার করতে পারেন, যা আপনার অ্যাপ্লিকেশন এবং পারফরম্যান্সের প্রয়োজন অনুযায়ী উপযুক্ত।
Read more